package com.gxc.array;

/**
 * 为了保证招聘信息的质量问题，公司为每个职位设计了打分系统，打分可以为正数，也可以为负数，
 * 正数表示用户认可帖子质量，负数表示用户不认可帖子质量，打分的分数根据评价用户的等级大小不定，
 * 比如可以为 1分，10分，30分，-10分等。
 * 假设数组A记录了一条帖子所有打分记录，现在需要找出帖子曾经得到过最高的分数是多少，
 * 用于后续根据最高分数来确认需要对发帖用户做相应的惩罚或奖励，
 * 其中，最高分的定义为:
 * 用户所有打分记录中，连续打分数据之和的最大值即认为是帖子曾经获得的最高分。
 * 例如:
 * 帖子10001010近期的打分记录为
 * [1,1,-1,-10,11,4,-6,9,20,-10,-2],
 * 那么该条帖子曾经到达过的最高分数为
 * 11+4+(-6)+9+20=38。
 * 请实现一段代码，输入为帖子近期的打分记录，输出为当前帖子得到的最高分数。
 *
 * 解法：
 * 从头开始遍历累计，当累计到负数时，累计值从0开始重新累计（累计值负数加入计算的会导致累计值变小）
 * 从i到j，累计值必定大于。如果累计值小于等于，则会被抛弃，不会进入最大和累计数组
 * i-1之前任意数值到i-1中间，累计值不小于0，如果累计和大于0，则一定会进入最大和累计数组
 */
public class TopScore {

    public static void main(String[] args) {
        int[] testArr = new int[]{1,1,-1,-10,11,4,-6,9,20,-10,-2};
        System.out.println(process(testArr));
    }
    
    public static int process(int[] arr) {
        int max = Integer.MIN_VALUE;
        int score = 0;
        for (int i = 0; i < arr.length; i++) {
            if (score<0) {
                score = 0;
            }
            score += arr[i];
            max = Math.max(score, max);
        }
        return max;
    }
    
}
